| GOOGL | |
|---|---|
| Date | |
| 2006-01-03 | 217.62 |
| 2006-01-04 | 222.62 |
| 2006-01-05 | 225.62 |
| 2006-01-06 | 232.83 |
| 2006-01-09 | 233.45 |
| ... | ... |
| 2015-12-24 | 765.84 |
| 2015-12-28 | 782.24 |
| 2015-12-29 | 793.96 |
| 2015-12-30 | 790.30 |
| 2015-12-31 | 778.01 |
2517 rows × 1 columns
\[ \small{ Sharpe = (R_p-R_f)\cdot{\sigma_j}^{-1}, \\ Sharpe - \text{współczynnik Sharpe'a}, \\ R_p - \text{zannualizowana średnia stopa zwrotu}, \\ R_f - \text{stopa zwrotu wolna od ryzyka}, \\ \sigma_j - \text{odchylenie standardowe portfela}.} \]
\[ \small{ Sortino = (R_j-R_f)\cdot{\sigma_d}^{-1}, \\ Sortino - \text{współczynnik Sortino}, \\ R_j - \text{zannualizowana średnia stopa zwrotu}, \\ R_f - \text{stopa zwrotu wolna od ryzyka}, \\ \sigma_d = \sqrt{\frac{1}{n}\sum_{i=1}^{n} \min(0, R_i - R_f)^2} - \\ -\text{ odchylenie standardowe ujemnych zwrotów}. } \]
| GOOGL | |
|---|---|
| Date | |
| 2006-01-03 | 217.62 |
| 2006-01-04 | 222.62 |
| 2006-01-05 | 225.62 |
| 2006-01-06 | 232.83 |
| 2006-01-09 | 233.45 |
| ... | ... |
| 2015-12-24 | 765.84 |
| 2015-12-28 | 782.24 |
| 2015-12-29 | 793.96 |
| 2015-12-30 | 790.30 |
| 2015-12-31 | 778.01 |
2517 rows × 1 columns
Wskaźnik Sortino dla akcji Google
rfr = 0.04
target_return = 0
returns = data.pct_change()
negative_returns = returns.loc[returns['GOOGL'] < target_return]
expected_return = returns.mean()
annualized_return = (expected_return+1)**252 - 1
down_std = negative_returns.std()
sortino_ratio = (annualized_return - rfr) / (down_std*np.sqrt(252))Sortino dla akcji Google wynosi ok. 0.702.
Sharpe dla akcji Google wynosi ok. 0.488.
Największa procentowa strata od szczytu do dna.
Zależy od wybranego okna czasowego.
# Maksymalne spadki
roll_max = data.rolling(center=False, min_periods=1, window=252).max()
# Dzienny spadek w stosunku do maksimum
daily_draw_down = data/roll_max - 1.0
# Maksymalny dzienny spadek
max_daily_draw_down = daily_draw_down.rolling(center=False, min_periods=1, window=252).min()
# Wykres
plt.figure(figsize=(15,8))
plt.plot(data.index, daily_draw_down, label='Dzienne spadki')
plt.plot(data.index, max_daily_draw_down, label='Maksymalne spadki w okresie 252 dni')
plt.legend()
plt.show()positions = pd.read_csv('data/test_pos.csv', index_col=0)
positions.index = pd.to_datetime(positions.index)
display(positions)| AMD | CERN | COST | DELL | GPS | INTC | MMM | cash | |
|---|---|---|---|---|---|---|---|---|
| index | ||||||||
| 2004-01-09 00:00:00+00:00 | 6961.92 | 21017.078750 | 7282.266152 | 21264.55188 | 7091.080020 | 21259.333890 | 21316.129606 | -6192.360298 |
| 2004-01-12 00:00:00+00:00 | 18198.58 | 18071.250000 | 17675.836401 | 10804.31924 | 10685.411865 | 17872.477480 | 10882.026400 | -3329.289887 |
| 2004-01-13 00:00:00+00:00 | 12060.86 | 11942.246250 | 12838.477446 | 16078.90380 | 16272.139000 | 12465.392511 | 12579.135758 | 4708.039735 |
| 2004-01-14 00:00:00+00:00 | 13102.40 | 15534.281250 | 14447.422640 | 15414.45080 | 15666.440185 | 14884.069620 | 13454.542620 | -2749.470030 |
| 2004-01-15 00:00:00+00:00 | 15518.40 | 14547.050000 | 14164.039680 | 14407.48813 | 14926.122619 | 14422.385864 | 13929.159049 | -2462.919316 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 2009-12-24 00:00:00+00:00 | -1199.11 | 1316.857500 | 22778.660580 | -3562.47039 | 76601.638113 | 36280.269375 | 17740.890304 | 16350.679211 |
| 2009-12-28 00:00:00+00:00 | 589.80 | 673.840032 | 24170.422856 | -1765.41500 | 83143.517604 | 37499.607147 | 15692.520137 | 7641.201795 |
| 2009-12-29 00:00:00+00:00 | 292.50 | 334.920016 | 20993.396552 | 858.85252 | 94500.729990 | 50509.461877 | 7946.648597 | -6583.290764 |
| 2009-12-30 00:00:00+00:00 | 1681.56 | -167.179992 | 34934.764512 | 91207.82625 | 29751.588246 | 38052.304640 | -3926.109096 | -22234.787956 |
| 2009-12-31 00:00:00+00:00 | 22254.32 | 9975.240484 | 47781.667800 | 53022.51955 | 27393.148240 | 18850.582240 | -1934.275491 | -11938.952799 |
1506 rows × 8 columns
| Start date | 2004-01-12 | |
|---|---|---|
| End date | 2009-12-31 | |
| Total months | 71 | |
| Backtest | ||
| Annual return | 8.791% | |
| Cumulative returns | 65.404% | |
| Annual volatility | 26.26% | |
| Sharpe ratio | 0.45 | |
| Calmar ratio | 0.15 | |
| Stability | 0.00 | |
| Max drawdown | -60.391% | |
| Omega ratio | 1.09 | |
| Sortino ratio | 0.66 | |
| Skew | 0.14 | |
| Kurtosis | 5.88 | |
| Tail ratio | 0.99 | |
| Daily value at risk | -3.261% | |
| Worst drawdown periods | Net drawdown in % | Peak date | Valley date | Recovery date | Duration |
|---|---|---|---|---|---|
| 0 | 60.39 | 2007-11-06 | 2009-03-09 | NaT | NaN |
| 1 | 24.10 | 2005-07-28 | 2006-09-07 | 2007-05-22 | 474 |
| 2 | 11.89 | 2004-06-25 | 2004-08-12 | 2004-11-05 | 96 |
| 3 | 10.87 | 2004-11-15 | 2005-04-18 | 2005-07-14 | 174 |
| 4 | 9.51 | 2007-07-16 | 2007-08-06 | 2007-09-13 | 44 |
# Mapowanie sektorów
sect_map = {'COST': 'Consumer Goods',
'INTC': 'Technology',
'CERN': 'Healthcare',
'GPS': 'Technology',
'MMM': 'Construction',
'DELL': 'Technology',
'AMD': 'Technology'}
pf.create_position_tear_sheet(returns,positions, sector_mappings=sect_map)| Top 10 long positions of all time | max |
|---|---|
| COST | 90.01% |
| DELL | 85.73% |
| CERN | 83.53% |
| MMM | 82.09% |
| INTC | 78.59% |
| AMD | 75.76% |
| GPS | 62.24% |
| Top 10 short positions of all time | max |
|---|---|
| AMD | -30.12% |
| DELL | -26.58% |
| CERN | -25.51% |
| MMM | -22.62% |
| GPS | -20.09% |
| INTC | -18.47% |
| COST | -16.44% |
| Top 10 positions of all time | max |
|---|---|
| COST | 90.01% |
| DELL | 85.73% |
| CERN | 83.53% |
| MMM | 82.09% |
| INTC | 78.59% |
| AMD | 75.76% |
| GPS | 62.24% |